# D:\pythonTestProject\pages\common.py

import cv2
import pytesseract
from PIL import Image
import numpy as np
import base64
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 配置 Tesseract 路径（如果未添加到系统 PATH 中）
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'


class CommonMethods:
    def find_element(self, driver, by, value):
        """
        查找元素，直到其可见或可交互。
        :param driver: WebDriver 实例
        :param by: 定位方式（如 By.XPATH）
        :param value: 定位值（如 XPath 字符串）
        :return: 找到的 WebElement
        """
        print(f"等待元素出现... {by}: {value}")
        element = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((by, value))
        )
        print(f"找到元素... {by}: {value}")
        return element

    def click_element(self, driver, by, value):
        """
        点击元素。
        :param driver: WebDriver 实例
        :param by: 定位方式（如 By.XPATH）
        :param value: 定位值（如 XPath 字符串）
        """
        element = self.find_element(driver, by, value)
        print("开始点击元素...")
        element.click()
        print("元素点击完成...")

    def enter_text(self, driver, by, value, text):
        """
        在输入框中输入文本。
        :param driver: WebDriver 实例
        :param by: 定位方式（如 By.XPATH）
        :param value: 定位值（如 XPath 字符串）
        :param text: 要输入的文本
        """
        element = self.find_element(driver, by, value)
        print(f"清空输入框并输入文本: {text}")
        element.clear()
        element.send_keys(text)
        print("文本输入完成...")

    @staticmethod
    def parse_captcha(driver, captcha_xpath):  # 【厉害】将方法改为静态方法
        """
        解析验证码图像并返回解析结果。
        :param driver: WebDriver 实例
        :param captcha_xpath: 验证码图像的 XPath
        :return: 解析得到的验证码文本
        """
        try:
            # 获取验证码图像的 src 属性
            captcha_img_element = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.XPATH, captcha_xpath))
            )
            captcha_src = captcha_img_element.get_attribute('src')

            # 提取 Base64 数据
            if captcha_src.startswith('data:image/jpg;base64,') or captcha_src.startswith('data:image/png;base64,'):
                base64_data = captcha_src.split(',')[1]
                img_data = base64.b64decode(base64_data)

                # 将 Base64 数据转换为图像
                img_array = np.frombuffer(img_data, np.uint8)
                captcha_image = cv2.imdecode(img_array, cv2.IMREAD_COLOR)

                # 图像预处理：灰度化、二值化、去噪
                gray = cv2.cvtColor(captcha_image, cv2.COLOR_BGR2GRAY)
                _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
                denoised = cv2.medianBlur(binary, 3)

                # 使用 Pillow 处理图像
                captcha_pil = Image.fromarray(denoised)

                # 使用 pytesseract 进行 OCR 文本识别
                captcha_text = pytesseract.image_to_string(captcha_pil, lang='eng', config='--psm 6')
                captcha_text = captcha_text.strip()

                print(f"解析到的验证码: {captcha_text}")

                # 保存验证码图像以便手动检查
                captcha_pil.save("captcha.png")
                print("验证码图像已保存为 captcha.png")

                return captcha_text
            else:
                print("无法解析验证码图像")
                raise Exception("无法解析验证码图像")
        except Exception as e:
            print(f"解析验证码过程中发生错误: {e}")
            raise